#include <iostream>

// 指针变量
void pointerVariable() {
    int var = 20;   // 实际变量声明
    int *ip;        // 指针变量的声明

    ip = &var; // 在指针变量中存储 var 的地址

    std::cout << "Value of var variable: ";
    std::cout << var << std::endl;

    // 输出在指针变量中存储的地址
    std::cout << "Address stored in ip variable: ";
    std::cout << ip << std::endl;

    // 访问指针中可用地址的值
    std::cout << "Value of *ip variable: ";
    std::cout << *ip << std::endl;
}

// 指针与数组
void pointerArray() {
    int arr[5] = {10, 100, 200, 300, 400};
    int *ptr;

    // 指针中的数组地址
    ptr = arr;

    for (int i = 0; i < 5; i++) {
        std::cout << "Address of arr[" << i << "] = ";
        std::cout << ptr << std::endl;

        // 移动到下一个位置
        ptr++;
    }
}

// 使用指针变量作为函数参数
void swap(int *x, int *y) {
    int temp;

    temp = *x; // 保存地址 x 的值
    *x = *y;   // 把 y 赋值给 x
    *y = temp; // 把 x 赋值给 y

    return;
}

// 引用
void reference() {
    int a = 10;
    int &b = a; // b 是一个初始化为 a 的引用

    std::cout << "Value of a: " << a << std::endl;
    std::cout << "Value of b: " << b << std::endl;

    a = 20; // 改变 a 的值

    std::cout << "Value of a: " << a << std::endl;
    std::cout << "Value of b: " << b << std::endl;
}

int main() {
    pointerVariable();
    pointerArray();

    int a = 100, b = 200;
    std::cout << "Before swap, a :" << a << std::endl;
    std::cout << "Before swap, b :" << b << std::endl;

    swap(&a, &b);

    std::cout << "After swap, a :" << a << std::endl;
    std::cout << "After swap, b :" << b << std::endl;

    reference();

    return 0;
}